package com.allinpay;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;

/**
 * @author : wushikai
 * <p>
 * date : 2020-11-28
 */
public class ArrayReflection {

    public static void test1() {

        int[] arr = {1, 2, 3};
        Class<?> componentType = arr.getClass().getComponentType();
        System.out.println("arr data type: " + componentType.getCanonicalName());

    }


    public static void test2() {

        int[][] dims = {{5, 1}, {10, 2}};
        System.out.println(Integer.TYPE);
        System.out.println(Integer.class);
        Object array = Array.newInstance(Integer.TYPE, 5, 1, 10);
        System.out.println(array instanceof int[][]);


        Class<?> classType0 = array.getClass().getComponentType(); // 返回数组元素类型
        System.out.println(classType0.getCanonicalName());

    }


    /**
     * 在反射中 操作 array 的这个 类 就是 : java.lang.reflect.Array
     */
    public static void test3() throws ClassNotFoundException {

        //array 通过反射 给 数组注入数据
        Object array = Array.newInstance(Object.class, 10);
        Array.set(array, 3, 888);
        System.out.println(Array.get(array, 3));


        //通过反射动态的创建 类型为 String 的一维数组
        Class<?> clazz = Class.forName("java.lang.String");
        //长度为10
        Object instance = Array.newInstance(clazz, 10);
        Array.set(instance, 5, "詹姆斯.高司令");
        System.out.println(Array.get(instance, 5));

        //通过反射动态的创建二维数组
        Class<?> clazz1 = Class.forName("java.lang.String");
        Object instance1 = Array.newInstance(clazz1, new int[]{10, 10});//目前是一维数组
        Array.set(Array.get(instance1, 5), 5, "林纳斯.托瓦兹");
        System.out.println(Array.get(Array.get(instance1, 5), 5));


    }

    /**
     * Java reflect.Array 利用反射创建，填充，显示数组
     */
    public static void test4() throws ClassNotFoundException {

        //创建
        Object array = Array.newInstance(int.class, 3);
        Class<?> type = array.getClass();
        //我们当然知道它是数组, 但是我们还是想让计算机去给我们判断
        if (type.isArray()) {

            Class<?> componentType = type.getComponentType(); //获取数组类型;
            System.out.println("Array of: " + componentType);
            System.out.println("Array size: " + Array.getLength(array)); //获取 数组的长度;

        }

        //填充 和  显示   注意: 不是通过普通的手法来做, 而是通过反射的手法来做;
        for (int i = 0; i < Array.getLength(array); i++) {
            Array.setInt(array, i, i);
            System.out.println("Position: " + i + ", value: " + Array.getInt(array, i));
        }

        //从头到尾, array 就是打酱油的, 就没有干过什么正事;  累死累活的都是 Array 这个类;
    }

    /**
     * 使用反射来给数组扩容, 这个 技巧 我觉得 ArrayList hashmap 中可能用到了; jdk 中源码===>
     */
    public static void test5() {

        Object target = null;
        int[] original = {1,2,3,4};
        Class<?> type = original.getClass();
        int finalLength = 1;
        if (type.isArray()) {

            finalLength= Array.getLength(original); //获得数组长度;
            finalLength=finalLength * 2;
            Class<?> elementType = type.getComponentType();
            target = Array.newInstance(elementType, finalLength); //二倍扩容
            System.arraycopy(original, 0, target, 0, original.length);

        }

        for (int i = 0; i < finalLength; i++) {

            System.out.println(Array.get(target, i));
        }

    }


    public static void main(String[] args) throws ClassNotFoundException {

        test5();
    }





}
